package api

import (
	"gitee.com/war2001/NiuMaEasyGo/nm_core/router"
	"github.com/gin-gonic/gin"
)

// ExampleController 示例控制器
// 展示如何使用新的自动发现机制
type ExampleController struct {
	BaseController
}

// 自动注册控制器
func init() {
	// 创建控制器实例
	controller := &ExampleController{}

	// 注册控制器
	RegisterSelf(controller)
}

// NewExampleController 创建示例控制器
// 这个函数会被控制器注册表通过反射调用
func NewExampleController() *ExampleController {
	return &ExampleController{}
}

// GetControllerInfo 获取控制器信息
func (c *ExampleController) GetControllerInfo() ControllerInfo {
	return ControllerInfo{
		Name:        "ExampleController",
		Description: "示例控制器，展示如何使用新的自动发现机制",
		Version:     "1.0",
		Author:      "System",
		BasePath:    "/example",
	}
}

// ListMetadata 获取列表元数据
func (c *ExampleController) ListMetadata() router.RouteMetadata {
	return GenerateRouteMetadata(
		"示例列表",           // 标题
		"/example/list",  // 路径
		"/example/index", // 组件
		"example",        // 图标
		"example:list",   // 权限
		"/example",       // 父级路径
		"menu",           // 菜单类型
		"system",         // 菜单分类
		"GET",            // HTTP方法
		"/list",          // API路径
		true,             // 需要认证
		1,                // 排序
		false,            // 是否隐藏
	)
}

// List 获取列表
func (c *ExampleController) List(ctx *gin.Context) {
	c.ResponseSuccess(ctx, []gin.H{
		{"id": 1, "name": "示例1"},
		{"id": 2, "name": "示例2"},
		{"id": 3, "name": "示例3"},
	})
}

// GetMetadata 获取详情元数据
func (c *ExampleController) GetMetadata() router.RouteMetadata {
	return GenerateRouteMetadata(
		"示例详情",            // 标题
		"/example/detail", // 路径
		"/example/detail", // 组件
		"",                // 图标
		"example:get",     // 权限
		"/example/list",   // 父级路径
		"menu",            // 菜单类型
		"system",          // 菜单分类
		"GET",             // HTTP方法
		"/:id",            // API路径
		true,              // 需要认证
		1,                 // 排序
		true,              // 是否隐藏
	)
}

// Get 获取详情
func (c *ExampleController) Get(ctx *gin.Context) {
	id := ctx.Param("id")
	c.ResponseSuccess(ctx, gin.H{
		"id":   id,
		"name": "示例" + id,
	})
}

// CreateMetadata 创建元数据
func (c *ExampleController) CreateMetadata() router.RouteMetadata {
	return GenerateRouteMetadata(
		"创建示例",           // 标题
		"",               // 路径
		"",               // 组件
		"",               // 图标
		"example:create", // 权限
		"/example/list",  // 父级路径
		"button",         // 菜单类型
		"system",         // 菜单分类
		"POST",           // HTTP方法
		"",               // API路径
		true,             // 需要认证
		2,                // 排序
		false,            // 是否隐藏
	)
}

// Create 创建
func (c *ExampleController) Create(ctx *gin.Context) {
	var req struct {
		Name string `json:"name" binding:"required"`
	}

	if err := ctx.ShouldBindJSON(&req); err != nil {
		c.ResponseBadRequest(ctx, "无效的请求参数: "+err.Error())
		return
	}

	c.ResponseSuccess(ctx, gin.H{
		"id":   100,
		"name": req.Name,
	})
}

// UpdateMetadata 更新元数据
func (c *ExampleController) UpdateMetadata() router.RouteMetadata {
	return GenerateRouteMetadata(
		"更新示例",           // 标题
		"",               // 路径
		"",               // 组件
		"",               // 图标
		"example:update", // 权限
		"/example/list",  // 父级路径
		"button",         // 菜单类型
		"system",         // 菜单分类
		"PUT",            // HTTP方法
		"/:id",           // API路径
		true,             // 需要认证
		3,                // 排序
		false,            // 是否隐藏
	)
}

// Update 更新
func (c *ExampleController) Update(ctx *gin.Context) {
	id := ctx.Param("id")

	var req struct {
		Name string `json:"name" binding:"required"`
	}

	if err := ctx.ShouldBindJSON(&req); err != nil {
		c.ResponseBadRequest(ctx, "无效的请求参数: "+err.Error())
		return
	}

	c.ResponseSuccess(ctx, gin.H{
		"id":   id,
		"name": req.Name,
	})
}

// DeleteMetadata 删除元数据
func (c *ExampleController) DeleteMetadata() router.RouteMetadata {
	return GenerateRouteMetadata(
		"删除示例",           // 标题
		"",               // 路径
		"",               // 组件
		"",               // 图标
		"example:delete", // 权限
		"/example/list",  // 父级路径
		"button",         // 菜单类型
		"system",         // 菜单分类
		"DELETE",         // HTTP方法
		"/:id",           // API路径
		true,             // 需要认证
		4,                // 排序
		false,            // 是否隐藏
	)
}

// Delete 删除
func (c *ExampleController) Delete(ctx *gin.Context) {
	id := ctx.Param("id")
	c.ResponseSuccess(ctx, gin.H{
		"id": id,
	})
}
